/**
  * Author: Mei
  * Date: 2020-12-10 10:09
  * Description: 
  * lambad表达式的使用
  *
  */
#include <vector>
#include <iostream>
#include <string>
#include <bitset>
#include <functional>
#include <algorithm>
#include <list>
#include <set>
#include <map>

using namespace std;


int main() {
    //如果不调用  没有意义
    [] {
        cout << "show time" << endl;
    }(); //只能调用一次
    int a = 10;
    auto I = [a]() -> void { //捕获外部变量a
        cout << a << endl;
        cout << "show time" << endl;
    };
    I();

    //lambda等同于一个函数对象
    int id = 0;
    auto f = [id]() mutable { //mutable表明id是可变的
        cout << "id: " << id << endl;
        ++id;
    };
    //[=] 接收外界所有的值
    id = 42;
    f();
    f();
    f();


    /**
     * 　remove只是通过迭代器的指针向前移动来删除，将没有被删除的元素放在的前面，
     * 并返回一个指向新的超尾值的迭代器。由于remove()函数不是成员，因此不能调整链表的长度。
     * remove()函数并不是真正的删除，要想真正删除元素则可以使用erase()或者resize()函数
     */
    vector<int> vi{32, 54, 865, 44, 77, 976, 123};
    int x = 30, y = 70;
    vi.erase(remove_if(  //remove之后序列应该为865 77 976 123 77 976 123 返回第二个
            vi.begin(),                                          //77的iterator
            vi.end(),
            [x, y](int n) {
                return x < n && n < y;
            }),
             vi.end()
    );
    for (auto v : vi) {
        cout << v << " ";
    }
    cout << endl;
    string str1 = "Text with some   spaces";
    str1.erase(remove(str1.begin(), str1.end(), ' '), str1.end());
    cout << str1 << endl;

    return 0;
}
